package it.polimi.traveldream.ejb.bean;

import it.polimi.authentication.ejb.usermanagement.Escursione;
import it.polimi.authentication.ejb.usermanagement.ListaEscursione;
import it.polimi.authentication.ejb.usermanagement.PacchettoEscursione;
import it.polimi.authentication.ejb.usermanagement.dto.EscursioneDTO;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class RitrovaListaEscursione implements ListaEscursione{


	@PersistenceContext
    private EntityManager em;
	
	public RitrovaListaEscursione(){	
	}
	
	@Override
	public ArrayList <EscursioneDTO> EscursioneList(){
	
		Query q= em.createNamedQuery("Escursione.findAll");
		
		List<Escursione>EscursioneList =(List<Escursione>) q.getResultList();
		
		ArrayList<EscursioneDTO> EscursioneListDTO = new ArrayList<EscursioneDTO>();
		
	
		for (int i=0; i<EscursioneList.size(); i++)
		{
			EscursioneDTO app = new EscursioneDTO();
			app.setNome(EscursioneList.get(i).getNomeEscursione());
			app.setCittaE(EscursioneList.get(i).getCittaEscursione());
			app.setCittaP(EscursioneList.get(i).getCittaPartenza());
			app.setMezzo(EscursioneList.get(i).getMezzo_utilizzato());
			app.setPrezzo(EscursioneList.get(i).getPrezzo());
			EscursioneListDTO.add(app);
		}
		
		return EscursioneListDTO;
	}
	
	@Override
	public ArrayList <EscursioneDTO> EscursioneList(String citta){
	
		Query q= em.createNamedQuery("Escursione.findEscursioneInCity").setParameter("city", citta);
		
		List<Escursione>EscursioneList =(List<Escursione>) q.getResultList();
		
		ArrayList<EscursioneDTO> EscursioneListDTO = new ArrayList<EscursioneDTO>();
		
		
	
		for (int i=0; i<EscursioneList.size(); i++)
		{
			EscursioneDTO app = new EscursioneDTO();
			app.setNome(EscursioneList.get(i).getNomeEscursione());
			app.setCittaE(EscursioneList.get(i).getCittaEscursione());
			app.setCittaP(EscursioneList.get(i).getCittaPartenza());
			app.setDisponibile(EscursioneList.get(i).getDisponibile());
			app.setMezzo(EscursioneList.get(i).getMezzo_utilizzato());
			app.setPrezzo(EscursioneList.get(i).getPrezzo());
			EscursioneListDTO.add(app);
		}
		
		return EscursioneListDTO;
	}
	
	@Override
	public void applicaModificaEscursione (String nomeEscursione, String mezzoEscursione, BigDecimal prezzoEscursione){
		
		BigDecimal vecchioPrezzoEscursione;
		Query vecchioPE;
		//prende il vecchio prezzo dell'escursione
		vecchioPE = em.createNamedQuery("Escursione.findPrezzo").setParameter("nomeEsc", nomeEscursione);
		vecchioPrezzoEscursione = (BigDecimal) vecchioPE.getSingleResult();
		
		String vecchioMezzo;
		Query vecchioM = em.createNamedQuery("Escursione.findMezzo").setParameter("nomeEsc", nomeEscursione);
		vecchioMezzo = (String) vecchioM.getSingleResult();
		
		if (mezzoEscursione!=null && mezzoEscursione!=vecchioMezzo) em.createNativeQuery("UPDATE Escursione e SET e.mezzo_utilizzato = '"+mezzoEscursione+"' WHERE e.nomeEscursione='"+nomeEscursione+"'").executeUpdate();
		if (prezzoEscursione!=null && prezzoEscursione!=vecchioPrezzoEscursione) {
	
			BigDecimal vecchioPrezzoPacchetto;
			BigDecimal nuovoPrezzo;
			Query vecchioP;
			
			
			//trova tutti i pacchetti che contengono l'escursione
			
			Query idP = em.createNamedQuery("PacchettoEscursione.findPacchetto").setParameter("nomeEscursione", nomeEscursione);
			List<PacchettoEscursione> idPacchetto = (List<PacchettoEscursione>) idP.getResultList();
			
			for(int i=0; i<idPacchetto.size();i++){
				//aggiorna i prezzi di tutti i pacchetti che contengono l'escursione
				
				nuovoPrezzo = new BigDecimal(0.00);
				//prende il prezzo del pacchetto al posto i della lista
				vecchioP = em.createNamedQuery("Pacchetto.findPrezzo").setParameter("idPacchetto", idPacchetto.get(i).getIDPacchetto());
				vecchioPrezzoPacchetto = (BigDecimal) vecchioP.getSingleResult();
			
				//somma per trovare il nuovo prezzo del pacchetto
				nuovoPrezzo = nuovoPrezzo.add(vecchioPrezzoPacchetto.subtract(vecchioPrezzoEscursione.subtract(prezzoEscursione)));
				
				System.out.println(nuovoPrezzo+"="+vecchioPrezzoPacchetto+"-"+vecchioPrezzoEscursione+"+"+prezzoEscursione);
			
				//sostituisce il prezzo in pacchetto
				em.createQuery("UPDATE Pacchetto p SET p.prezzo ="+nuovoPrezzo+" WHERE p.id='"+idPacchetto.get(i).getIDPacchetto()+"'").executeUpdate();
			}
		
			//aggiorna il prezzo dell'escursione
			em.createQuery("UPDATE Escursione e SET e.prezzo ="+prezzoEscursione+" WHERE e.nomeEscursione='"+nomeEscursione+"'").executeUpdate();
		}
	}

	@Override
	public EscursioneDTO thisEscursione(String name) {
		Query q =  em.createNamedQuery("Escursione.findThis").setParameter("nomeEsc", name);
	    ArrayList <Escursione> elementList = (ArrayList <Escursione>) q.getResultList();
	    
	    EscursioneDTO element = new EscursioneDTO();
	    element.setNomeEscursione(elementList.get(0).getNomeEscursione());
	    element.setCittaE(elementList.get(0).getCittaEscursione());
	    element.setCittaP(elementList.get(0).getCittaPartenza());
	    element.setDisponibile(elementList.get(0).getDisponibile());
	    element.setMezzo(elementList.get(0).getMezzo_utilizzato());
	    element.setPrezzo(elementList.get(0).getPrezzo());
	    
		return element;
	}
	
	
}


